﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;

namespace Marmat.Forms
{
    public partial class ComboBox
    {
        [Editor("System.Windows.Forms.Design.ListControlStringCollectionEditor, System.Design", typeof(UITypeEditor))]
        public class ItemCollection : IList
        {
            private readonly List<object> list = new List<object>();
            private readonly DevExpress.XtraEditors.Controls.ListBoxItemCollection Collection;

            internal ItemCollection(DevExpress.XtraEditors.Controls.ListBoxItemCollection collection)
            {
                this.Collection = collection;
            }

            /// <summary>
            /// 将某项添加到 System.Collections.Generic.ICollection(Of T) 中。
            /// </summary>
            /// <param name="value">要添加到 System.Collections.Generic.ICollection(Of T) 的对象。</param>
            /// <remarks></remarks>
            public int Add(object value)
            {
                this.list.Add(value);
                return this.Collection.Add(value);
            }

            /// <summary>
            /// 向 System.Windows.Forms.ComboBox 的项列表添加项的数组。
            /// </summary>
            /// <param name="items"> 要向列表添加的对象的数组。</param>
            /// <remarks></remarks>
            public void AddRange(object[] items)
            {
                foreach (object item in items)
                    this.Add(item);
            }

            /// <summary>
            /// 向 System.Windows.Forms.ComboBox 的项列表添加项的数组。
            /// </summary>
            /// <param name="items"> 要向列表添加的对象的数组。</param>
            /// <remarks></remarks>
            public void AddRange(string[] items)
            {
                foreach (string item in items)
                    this.Add(item);
            }

            /// <summary>
            /// 向 System.Windows.Forms.ComboBox 的项列表添加项的数组。
            /// </summary>
            /// <param name="items"> 要向列表添加的对象的数组。</param>
            /// <remarks></remarks>
            public void AddRange(int[] items)
            {
                foreach (int item in items)
                    this.Add(item);
            }

            /// <summary>
            /// 从 System.Collections.Generic.ICollection(Of T) 中移除所有项。
            /// </summary>
            /// <remarks></remarks>
            public void Clear()
            {
                this.list.Clear();
                this.Collection.Clear();
            }

            /// <summary>
            /// 确定 System.Collections.Generic.ICollection(Of T) 是否包含特定值。
            /// </summary>
            /// <param name="item">要在 System.Collections.Generic.ICollection(Of T) 中定位的对象。</param>
            /// <returns>如果在 System.Collections.Generic.ICollection(Of T) 中找到 item，则为 true；否则为 false。</returns>
            /// <remarks></remarks>
            public bool Contains(object item)
            {
                return this.list.Contains(item);
            }

            void ICollection.CopyTo(Array array, int index)
            {
                // 无需处理=================================================
            }

            /// <summary>
            /// 获取 System.Collections.Generic.ICollection(Of T) 中包含的元素数。
            /// </summary>
            /// <value></value>
            /// <returns>System.Collections.Generic.ICollection(Of T) 中包含的元素数。</returns>
            /// <remarks></remarks>
            public int Count
            {
                get
                {
                    return this.list.Count;
                }
            }

            /// <summary>
            /// 获取一个值，该值指示 System.Collections.Generic.ICollection(Of T) 是否为只读。
            /// </summary>
            /// <value></value>
            /// <returns></returns>
            /// <remarks></remarks>
            public bool IsReadOnly
            {
                get
                {
                    return false;
                }
            }

            /// <summary>
            /// 从 System.Collections.Generic.ICollection(Of T) 中移除特定对象的第一个匹配项。
            /// </summary>
            /// <param name="item"></param>
            /// <remarks></remarks>
            public void Remove(object item)
            {
                this.Collection.Remove(item);
                this.list.Remove(item);
            }

            /// <summary>
            /// 返回一个循环访问集合的枚举器。
            /// </summary>
            /// <returns></returns>
            /// <remarks></remarks>
            public IEnumerator GetEnumerator()
            {
                return this.list.GetEnumerator();
            }

            /// <summary>
            /// 搜索指定的对象，并返回整个 System.Collections.Generic.List(Of T) 中第一个匹配项的从零开始的索引。
            /// </summary>
            /// <param name="item">要在 System.Collections.Generic.List(Of T) 中查找的对象。对于引用类型，该值可以为 null。</param>
            /// <returns>如果在整个 System.Collections.Generic.List(Of T) 中找到 item 的第一个匹配项，则为该项的从零开始的索引；否则为 -1。</returns>
            /// <remarks></remarks>
            public int IndexOf(object item)
            {
                return this.list.IndexOf(item);
            }

            /// <summary>
            /// 将一个项插入指定索引处的 System.Collections.Generic.IList(Of T)。
            /// </summary>
            /// <param name="index">从零开始的索引，应在该位置插入 item。</param>
            /// <param name="item">要插入到 System.Collections.Generic.IList(Of T) 中的对象。</param>
            /// <remarks></remarks>
            public void Insert(int index, object item)
            {
                this.list.Insert(index, item);
                this.Collection.Insert(index, item);
            }

            /// <summary>
            /// 获取或设置指定索引处的元素。
            /// </summary>
            /// <param name="index">要获得或设置的元素从零开始的索引。</param>
            /// <value></value>
            /// <returns></returns>
            /// <remarks></remarks>
            public object this[int index]
            {
                get
                {
                    return this.list[index];
                }

                set
                {
                    this.list[index] = value;
                    this.Collection[index] = value;
                }
            }

            /// <summary>
            /// 移除指定索引处的 System.Collections.Generic.IList(Of T) 项。
            /// </summary>
            /// <param name="index">从零开始的索引（属于要移除的项）。</param>
            /// <remarks></remarks>
            public void RemoveAt(int index)
            {
                this.list.RemoveAt(index);
                this.Collection.RemoveAt(index);
            }

            // Private Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator
            // Return Me.list.GetEnumerator
            // End Function





            public bool IsSynchronized
            {
                get
                {
                    return true;
                }
            }

            public object SyncRoot
            {
                get
                {
                    return this.list;
                }
            }

            public bool IsFixedSize
            {
                get
                {
                    return false;
                }
            }
        }
    }
}